package pe.gob.mininter.dirandro.vaadin.panel.parte;

import java.util.List;

import pe.gob.mininter.dirandro.model.Expediente;
import pe.gob.mininter.dirandro.model.Importe;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.ImporteService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class PanelRegistroParteDinero extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
	
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private Table tblDinero;
	@AutoGenerated
	private Button btnRegistrar;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_25;
	@AutoGenerated
	private TextField txtNroTarjeta;
	@AutoGenerated
	private TextField txtNroCuenta;
	@AutoGenerated
	private ComboBoxLOVS cmbBanco;
	@AutoGenerated
	private ComboBoxLOVS cmbTipoCuenta;
	@AutoGenerated
	private HorizontalLayout pnlPrincipal;
	@AutoGenerated
	private OptionGroup rbAutenticidad;
	@AutoGenerated
	private ComboBoxLOVS cmbSituacion;
	@AutoGenerated
	private TextField txtMonto;
	@AutoGenerated
	private ComboBoxLOVS cmbTipoMoneda;
	
	private static final long serialVersionUID = -4639683924066371051L;
	
	private static final String COLUMN_ID = "COLUMN_ID"; 
	private static final String COLUMN_TIPO_MONEDA_ID = "COLUMN_TIPO_MONEDA_ID";
	private static final String COLUMN_TIPO_MONEDA_NOMBRE = "COLUMN_TIPO_MONEDA_NOMBRE";
	private static final String COLUMN_SITUACION_ID = "COLUMN_SITUACION_ID";
	private static final String COLUMN_SITUACION_NOMBRE = "COLUMN_SITUACION_NOMBRE";
	private static final String COLUMN_BANCO_ID = "COLUMN_BANCO_ID";
	private static final String COLUMN_BANCO_NOMBRE = "COLUMN_BANCO_NOMBRE";
	private static final String COLUMN_TIPO_CUENTA_ID = "COLUMN_TIPO_CUENTA_ID";
	private static final String COLUMN_TIPO_CUENTA_NOMBRE = "COLUMN_TIPO_CUENTA_NOMBRE";
	private static final String COLUMN_NRO_CUENTA = "COLUMN_NRO_CUENTA";
	private static final String COLUMN_NRO_TARJETA = "COLUMN_NRO_TARJETA";
	private static final String COLUMN_MONTO = "COLUMN_MONTO";
	private static final String COLUMN_AUTENTICIDAD = "COLUMN_AUTENTICIDAD";
	
	private Expediente expediente;
	private Importe expImporte;
	private boolean inicializado = false;
	private ImporteService importeService;
	private IndexedContainer container;
	
	public PanelRegistroParteDinero() {
		buildMainLayout();
		importeService = Injector.obtenerServicio(ImporteService.class);
		setCompositionRoot(mainLayout);
		postConstruct();
	}
	
	public void setExpediente(Expediente expediente) {
		this.expediente = expediente;
		postConstruct();
	}
	
	public void postConstruct() {
		if(expediente!=null && !expediente.esNuevo() && !inicializado){
			System.out.println("test");
			cmbBanco.setInputPrompt("Banco Proveniente");
			cmbTipoMoneda.setInputPrompt("Tipo de Moneda");
			cmbTipoCuenta.setInputPrompt("Tipo de Cuenta");
			cmbSituacion.setInputPrompt("Situacion del Dinero");
			
			cmbSituacion.setRequired(true);
			cmbTipoMoneda.setRequired(true);
			
			cmbBanco.setCodigoLista(Constante.LISTA.CODIGO.BANCO);
			cmbBanco.attach();
			cmbTipoCuenta.setCodigoLista(Constante.LISTA.CODIGO.TIPO_CUENTA);
			cmbTipoCuenta.attach();
			cmbTipoMoneda.setCodigoLista(Constante.LISTA.CODIGO.MONEDA);
			cmbTipoMoneda.attach();
			cmbSituacion.setCodigoLista(Constante.LISTA.CODIGO.SITUACION_GENERAL);
			cmbSituacion.attach();
			
			rbAutenticidad.addItem("V");
			rbAutenticidad.addItem("F");
			
			tblDinero.setSelectable(true);
			tblDinero.setImmediate(true);
			tblDinero.setNullSelectionAllowed(true);
			tblDinero.setNullSelectionItemId(null);
			tblDinero.addListener(new ValueChangeListener() {
				
				private static final long serialVersionUID = 8734616230079132082L;

				@Override
				public void valueChange(ValueChangeEvent event) {
					boolean esModoNuevo = tblDinero.getValue() == null;
					limpiar();
					habilitarEdicion(!esModoNuevo);
					if(esModoNuevo){
						tblDinero.setValue(null);
					}else{
						Item item = tblDinero.getItem(tblDinero.getValue());
						expImporte.setId((Long) item.getItemProperty(COLUMN_ID).getValue());
						cmbBanco.select(new Valor((Long) item.getItemProperty(COLUMN_BANCO_ID).getValue()));
						cmbTipoCuenta.select(new Valor((Long) item.getItemProperty(COLUMN_TIPO_CUENTA_ID).getValue()));
						cmbTipoMoneda.select(new Valor((Long) item.getItemProperty(COLUMN_TIPO_MONEDA_ID).getValue()));
						cmbSituacion.select(new Valor((Long) item.getItemProperty(COLUMN_SITUACION_ID).getValue()));
						txtMonto.setValue(item.getItemProperty(COLUMN_MONTO).getValue());
						txtNroCuenta.setValue(item.getItemProperty(COLUMN_NRO_CUENTA).getValue());
						txtNroTarjeta.setValue(item.getItemProperty(COLUMN_NRO_TARJETA).getValue());
						rbAutenticidad.setValue(item.getItemProperty(COLUMN_AUTENTICIDAD).getValue());
					}	
				}
			});
			
			btnRegistrar.addListener((ClickListener) this);
			cargarContainer();
			
			refrescar();
			inicializado = true;
		}
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnRegistrar)) {
			expImporte.setBanco(cmbBanco.getValue() != null ? cmbBanco.getValor() : null);
			expImporte.setMoneda(HarecUtil.toDouble(txtMonto.getValue()));
			expImporte.setTipoMoneda(cmbTipoMoneda.getValor());
			expImporte.setTipoCuenta(cmbTipoCuenta.getValue() != null ? cmbTipoCuenta.getValor() : null);
			expImporte.setSituacion(cmbSituacion.getValor());
			expImporte.setNroCuenta(HarecUtil.nullToEmpty(txtNroCuenta.getValue()));
			expImporte.setNroTarjeta(HarecUtil.nullToEmpty(txtNroTarjeta.getValue()));
			expImporte.setAutenticidad(HarecUtil.nullToEmpty(rbAutenticidad.getValue()));
			expImporte.setExpediente(expediente);
			
			if(expImporte.esNuevo()) {
				importeService.crear(expImporte);
			} else {
				importeService.actualizar(expImporte);
			}
			refrescar();
		}
	}
	
	public void refrescar(){
		habilitarEdicion(false);
		limpiar();
		cargarTablaDinero();
	}

	private void habilitarEdicion(boolean flag) {
		if(flag){
			btnRegistrar.setCaption("Actualizar");
		}else{
			btnRegistrar.setCaption("Crear");
		}
	}
	
	private void limpiar() {
		expImporte = new Importe();
		cmbBanco.select(null);
		cmbSituacion.select(null);
		cmbTipoCuenta.select(null);
		cmbTipoMoneda.select(null);
		txtMonto.setValue("");
		txtNroCuenta.setValue("");
		txtNroTarjeta.setValue("");
		rbAutenticidad.select(null);
	}	
		
	private void cargarContainer() {
		container = new IndexedContainer();
		container.addContainerProperty(COLUMN_ID, Long.class,  null);
		container.addContainerProperty(COLUMN_TIPO_MONEDA_ID, Long.class, null);
		container.addContainerProperty(COLUMN_TIPO_MONEDA_NOMBRE, String.class, null);
		container.addContainerProperty(COLUMN_SITUACION_ID, Long.class, null);
		container.addContainerProperty(COLUMN_SITUACION_NOMBRE, String.class, null);
		container.addContainerProperty(COLUMN_NRO_CUENTA, String.class, null);
		container.addContainerProperty(COLUMN_NRO_TARJETA, String.class, null);
		container.addContainerProperty(COLUMN_MONTO, Double.class, null);
		container.addContainerProperty(COLUMN_AUTENTICIDAD, String.class, null);
		container.addContainerProperty(COLUMN_TIPO_CUENTA_ID, Long.class, null);
		container.addContainerProperty(COLUMN_TIPO_CUENTA_NOMBRE, String.class, null);
		container.addContainerProperty(COLUMN_BANCO_ID, Long.class, null);
		container.addContainerProperty(COLUMN_BANCO_NOMBRE, String.class, null);
		
		tblDinero.setContainerDataSource(container);
		tblDinero.setVisibleColumns(new Object[] {COLUMN_TIPO_MONEDA_NOMBRE, COLUMN_MONTO, COLUMN_SITUACION_NOMBRE, COLUMN_AUTENTICIDAD, COLUMN_BANCO_NOMBRE, COLUMN_NRO_CUENTA });
		
		tblDinero.setColumnHeader(COLUMN_TIPO_MONEDA_NOMBRE, "Tipo de Moneda");
		tblDinero.setColumnHeader(COLUMN_MONTO, "Dinero Incautado");
		tblDinero.setColumnHeader(COLUMN_SITUACION_NOMBRE, "Situación del Dinero");
		tblDinero.setColumnHeader(COLUMN_BANCO_NOMBRE, "Banco");
		tblDinero.setColumnHeader(COLUMN_NRO_TARJETA, "Nro. de Tarjeta");
		tblDinero.setColumnHeader(COLUMN_NRO_CUENTA, "Nro. de Cuenta");
		tblDinero.setColumnHeader(COLUMN_AUTENTICIDAD, "Es Autentico?");
	}
	
	public void cargarTablaDinero() {
		expImporte.setExpediente(expediente);
		List<Importe> lstExpImportes = importeService.buscar(expImporte);
		container.removeAllItems();
		
		for (Importe importe : lstExpImportes) {
			Item item = container.addItem(importe.getId());
			item.getItemProperty(COLUMN_ID).setValue(importe.getId());
			item.getItemProperty(COLUMN_TIPO_MONEDA_ID).setValue(HarecUtil.valorIdToEmpty(importe.getTipoMoneda()));
			item.getItemProperty(COLUMN_TIPO_MONEDA_NOMBRE).setValue(HarecUtil.valorNombreToEmpty(importe.getTipoMoneda()));
			item.getItemProperty(COLUMN_SITUACION_ID).setValue(HarecUtil.valorIdToEmpty(importe.getSituacion()));
			item.getItemProperty(COLUMN_SITUACION_NOMBRE).setValue(HarecUtil.valorNombreToEmpty(importe.getSituacion()));
			item.getItemProperty(COLUMN_TIPO_CUENTA_ID).setValue(HarecUtil.valorIdToEmpty(importe.getTipoCuenta()));
			item.getItemProperty(COLUMN_TIPO_CUENTA_NOMBRE).setValue(HarecUtil.valorNombreToEmpty(importe.getTipoCuenta()));
			item.getItemProperty(COLUMN_MONTO).setValue(importe.getMoneda());
			item.getItemProperty(COLUMN_BANCO_ID).setValue(HarecUtil.valorIdToEmpty(importe.getBanco()));
			item.getItemProperty(COLUMN_BANCO_NOMBRE).setValue(HarecUtil.valorNombreToEmpty(importe.getBanco()));
			item.getItemProperty(COLUMN_NRO_CUENTA).setValue(HarecUtil.nullToEmpty(importe.getNroCuenta()));
			item.getItemProperty(COLUMN_NRO_TARJETA).setValue(HarecUtil.nullToEmpty(importe.getNroTarjeta()));
			item.getItemProperty(COLUMN_AUTENTICIDAD).setValue(HarecUtil.nullToEmpty(importe.getAutenticidad()));
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("-1px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("-1px");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		
		// horizontalLayout_25
		horizontalLayout_25 = buildHorizontalLayout_25();
		mainLayout.addComponent(horizontalLayout_25);
		
		// btnRegistrar
		btnRegistrar = new Button();
		btnRegistrar.setCaption("Registrar");
		btnRegistrar.setImmediate(true);
		btnRegistrar.setWidth("-1px");
		btnRegistrar.setHeight("-1px");
		mainLayout.addComponent(btnRegistrar);
		mainLayout.setComponentAlignment(btnRegistrar, new Alignment(20));
		
		// tblDinero
		tblDinero = new Table();
		tblDinero.setImmediate(false);
		tblDinero.setWidth("900px");
		tblDinero.setHeight("350px");
		mainLayout.addComponent(tblDinero);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new HorizontalLayout();
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(false);
		pnlPrincipal.setSpacing(true);
		
		// cmbTipoMoneda
		cmbTipoMoneda = new ComboBoxLOVS();
		cmbTipoMoneda.setCaption("Tipo de Moneda");
		cmbTipoMoneda.setImmediate(false);
		cmbTipoMoneda.setWidth("150px");
		cmbTipoMoneda.setHeight("-1px");
		pnlPrincipal.addComponent(cmbTipoMoneda);
		
		// txtMonto
		txtMonto = new TextField();
		txtMonto.setCaption("Monto");
		txtMonto.setImmediate(false);
		txtMonto.setWidth("120px");
		txtMonto.setHeight("-1px");
		txtMonto.setRequired(true);
		txtMonto.setInputPrompt("Monto");
		txtMonto.setMaxLength(8);
		pnlPrincipal.addComponent(txtMonto);
		
		// cmbSituacion
		cmbSituacion = new ComboBoxLOVS();
		cmbSituacion.setCaption("Situación");
		cmbSituacion.setImmediate(false);
		cmbSituacion.setWidth("150px");
		cmbSituacion.setHeight("-1px");
		pnlPrincipal.addComponent(cmbSituacion);
		
		// rbAutenticidad
		rbAutenticidad = new OptionGroup();
		rbAutenticidad.setStyleName("horizontal");
		rbAutenticidad.setCaption("Situación del Dinero Incautado");
		rbAutenticidad.setImmediate(false);
		rbAutenticidad.setWidth("300px");
		rbAutenticidad.setHeight("20px");
		rbAutenticidad.setRequired(true);
		pnlPrincipal.addComponent(rbAutenticidad);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_25() {
		// common part: create layout
		horizontalLayout_25 = new HorizontalLayout();
		horizontalLayout_25.setImmediate(false);
		horizontalLayout_25.setWidth("-1px");
		horizontalLayout_25.setHeight("-1px");
		horizontalLayout_25.setMargin(false);
		horizontalLayout_25.setSpacing(true);
		
		// cmbTipoCuenta
		cmbTipoCuenta = new ComboBoxLOVS();
		cmbTipoCuenta.setCaption("Tipo de Cuenta");
		cmbTipoCuenta.setImmediate(false);
		cmbTipoCuenta.setWidth("200px");
		cmbTipoCuenta.setHeight("-1px");
		horizontalLayout_25.addComponent(cmbTipoCuenta);
		
		// cmbBanco
		cmbBanco = new ComboBoxLOVS();
		cmbBanco.setCaption("Banco de la Cuenta");
		cmbBanco.setImmediate(false);
		cmbBanco.setWidth("200px");
		cmbBanco.setHeight("-1px");
		horizontalLayout_25.addComponent(cmbBanco);
		
		// txtNroCuenta
		txtNroCuenta = new TextField();
		txtNroCuenta.setCaption("Numero de Cuenta");
		txtNroCuenta.setImmediate(false);
		txtNroCuenta.setWidth("200px");
		txtNroCuenta.setHeight("-1px");
		txtNroCuenta.setInputPrompt("Numero de Cuenta");
		txtNroCuenta.setMaxLength(20);
		horizontalLayout_25.addComponent(txtNroCuenta);
		
		// txtNroTarjeta
		txtNroTarjeta = new TextField();
		txtNroTarjeta.setCaption("Numero de Tarjeta");
		txtNroTarjeta.setImmediate(false);
		txtNroTarjeta.setWidth("200px");
		txtNroTarjeta.setHeight("-1px");
		txtNroTarjeta.setInputPrompt("Numero de Tarjeta");
		txtNroTarjeta.setMaxLength(24);
		horizontalLayout_25.addComponent(txtNroTarjeta);
		
		return horizontalLayout_25;
	}

}
